/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package py.fpuna.ii.electiva2.client.clases;


import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.Iterator;
import java.util.List;
import py.fpuna.ii.electiva2.client.GWTServiceProv;
import py.fpuna.ii.electiva2.client.GWTServiceProvAsync;
import py.fpuna.ii.electiva2.client.model.ProveedorModel;





/**
 *
 * @author sebastian
 */
public class ABMProveedores extends VerticalPanel{

    ABMProveedores miABM;
    FlexTable datos = new FlexTable();
    TextBox text_razon_social = new TextBox();
    TextBox textDireccion = new TextBox();
    TextBox textTelefono = new TextBox();
    
    Button guardar = new Button("Agregar");
    Button modificar = new Button("Modificar");
    Button volver = new Button("Volver");
    private Label resultado = new Label();

    private HorizontalPanel buscador = new HorizontalPanel();
    private Label buscarProvRazonSocial = new Label("Buscar por razon social del Proveedor");
    private TextBox buscarProveedor = new TextBox();
    private Button botonBuscar = new Button("Buscar");

    FlexTable tablaProv = new FlexTable();

    Integer k;  //identificador de la clave del proveedor usada en los metodos finales

    public ABMProveedores(){
            
        datos.setText(0, 0, "Razon_Social");
        datos.setText(1, 0, "Direccion");
        datos.setText(2, 0, "Telefono");
        datos.setWidget(0,1, text_razon_social);
        datos.setWidget(1,1, this.textDireccion);
        datos.setWidget(2,1, this.textTelefono);

        miABM = this;   //me referencio a mi mismo
        miABM.add(datos);
        miABM.setSpacing(10);
        miABM.add(guardar);
        modificar.setVisible(false);

        miABM.add(modificar);
        miABM.add(resultado);

        buscador.setSpacing(5);
        buscador.add(buscarProvRazonSocial);
        buscador.add(buscarProveedor);
        buscador.add(botonBuscar);
        miABM.add(buscador);


        miABM = this;   //me referencio a mi mismo
        mostrarTabla();

        guardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                agregarProveedor();
            }
        });

        botonBuscar.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
                buscarProveedor(buscarProveedor.getText());
            }

        });

    }

    public static GWTServiceProvAsync getService() {
        // Create the client proxy. Note that although you are creating the
        // service interface proper, you cast the result to the asynchronous
        // version of the interface. The cast is always safe because the
        // generated proxy implements the asynchronous interface automatically.

        return GWT.create(GWTServiceProv.class);
    }

    private void agregarProveedor()
    {
        final String raz = this.text_razon_social.getText();
        final String dir = this.textDireccion.getText();
        final String telf = this.textTelefono.getText();

        if ( raz.compareTo("") == 0 ||
             dir.compareTo("")== 0 ||
             telf.compareTo("") == 0 )
        {
            Window.setTitle("TAREA GWT - EJB");
            Window.alert("Debe cargar todos los campos D; ");
            text_razon_social.setFocus(true);
            return;
        }

        ProveedorModel prov = new ProveedorModel();
        prov.setProvRazonSocial(raz);
        prov.setProvDireccion(dir);
        prov.setProvTelefono(telf);

        // Create an asynchronous callback to handle the result.
        final AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onSuccess(String result) {
                if (result.equalsIgnoreCase("true")){
                    textDireccion.setText("");
                    textTelefono.setText("");
                    text_razon_social.setText("");
                    Window.alert("Registro guardado satisfactoriamente");
                    mostrarTabla();
                }else{
                    Window.alert("Error. El registro no ha sido guardado");
                }
            }
            public void onFailure(Throwable caught) {
                Window.alert("Error. Ingrese palabras mas cortas en los campos");
            }
        };

        getService().guardarProveedor(prov, callback);

    }


    private void mostrarTabla(){
        miABM.remove(tablaProv);
        tablaProv = new FlexTable();

        final AsyncCallback< List<ProveedorModel> > callback2 = new AsyncCallback< List<ProveedorModel> >() {
            public void onSuccess(List<ProveedorModel> result) {
                tablaProv.setWidth("800px");
                tablaProv.setText(0, 0, "Razon Social");
                tablaProv.setText(0, 1, "Direccion");
                tablaProv.setText(0, 2, "Telefono");
                tablaProv.setText(0, 3, "Modificar");
                tablaProv.setText(0, 4, "Eliminar");
                tablaProv.setBorderWidth(1);
                if (result == null){
                    resultado.setText("No hay datos en la tabla");
                }else{  //recibi datos en result

                    Iterator <ProveedorModel> provIt = result.iterator();
                    int f = 1;

                    while(provIt.hasNext()){
                        ProveedorModel provM = provIt.next();
                        tablaProv.setWidget(f, 0, new Label(provM.getProvRazonSocial()));
                        tablaProv.setWidget(f, 1, new Label(provM.getProvDireccion()));
                        tablaProv.setWidget(f, 2, new Label(provM.getProvTelefono()));
                       
                        final int key = provM.getProvCodigo();
                        final ProveedorModel pM = provM; //prepara un cliente para modificarlo

                        tablaProv.setWidget(f, 3, new Button("Modificar", new ClickHandler() {
                                                        public void onClick(ClickEvent event) {
                                                            modificarProv(key,pM);
                                                        }
                                                    }));
                        tablaProv.setWidget(f, 4, new Button("Eliminar",  new ClickHandler() {
                                                        public void onClick(ClickEvent event) {
                                                            eliminarProv(key);
                                                        }
                                                    }));
                        f++;
                    }
                }
               
                miABM.add(tablaProv); //cargo la tabla en mi mismo
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Fallo la comunicacion");
            }
        };

        getService().listarProv(callback2);
    }

    /**
     * modifica un proveedor
     * @param codigo identificador del proveedor
     * @param prov los datos de ese proveedor
     */
    private void modificarProv(Integer codigo, ProveedorModel prov){

        k = codigo; //identificador del proveedor cargado en var auxiliar

        //le muestro lo que puede modificar
        this.text_razon_social.setText(prov.getProvRazonSocial());
        this.textDireccion.setText(prov.getProvDireccion());
        this.textTelefono.setText(prov.getProvTelefono());

        // Create an asynchronous callback to handle the result.
        final AsyncCallback<String> callback4 = new AsyncCallback<String>() {
            public void onSuccess(String result) {
                if (result.equalsIgnoreCase("modificado")){

                    k = null;   //ya no uso mas k, entoncs limpio
                    modificar.setVisible(false);
                    guardar.setVisible(true);

                    //limpio todo lo que use
                    textDireccion.setText("");
                    textTelefono.setText("");
                    text_razon_social.setText("");

                    Window.alert("Registro modificado satisfactoriamente");
                    mostrarTabla();

                }else{
                    Window.alert("Error. El registro no ha sido modificado");
                }

            }

            public void onFailure(Throwable caught) {
                Window.alert("Error. Ingrese palabras mas cortas en los campos");
            }
        };

        
        //oculto el boton guardar y muestro el modificar
        guardar.setVisible(false);
        modificar.setVisible(true);

        //coloco la llamdada remota en el boton modificar
        modificar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {

                //guardo lo que modifico
                String raz = text_razon_social.getText();
                String dir = textDireccion.getText();
                String telf = textTelefono.getText();

                //verifico que todo este cargado
                if ( raz.compareTo("") == 0 ||
                     dir.compareTo("")== 0 ||
                     telf.compareTo("") == 0 )
                {
                    Window.setTitle("TAREA GWT - EJB");
                    Window.alert("Debe cargar todos los campos D; ");
                    text_razon_social.setFocus(true);
                    return;
                }

                //actualizo los datos guardandolos en uno nuevo
                ProveedorModel provm = new ProveedorModel();
                provm.setProvRazonSocial(raz);
                provm.setProvDireccion(dir);
                provm.setProvTelefono(telf);

                //le paso el identificador del proveedor y lo q cambio
                getService().modificarProv(k, provm, callback4);

            }
        });
    }

    /**
     * elimina un proveedor de la tabla 
     * @param codigo del proveedor a ser eliminado
     */
    private void eliminarProv(Integer codigo){

        // Create an asynchronous callback to handle the result.
        final AsyncCallback<String> callback3 = new AsyncCallback<String>() {
            public void onSuccess(String result) {
                mostrarTabla();
                Window.alert("Registro eliminado satisfactoriamente");
            }

            public void onFailure(Throwable caught) {
                Window.alert("Error.No se ha podido Eliminar el Registro porque esta siendo utilizado");
            }
        };

        getService().eliminarProv(codigo, callback3);

    }


    public void buscarProveedor(String provRazSoc){
        miABM.remove(tablaProv);
        tablaProv = new FlexTable();

        final AsyncCallback< List<ProveedorModel> > callback5 = new AsyncCallback< List<ProveedorModel> >() {
            public void onSuccess(List<ProveedorModel> result) {
                tablaProv.setWidth("800px");
                tablaProv.setText(0, 0, "Razon Social");
                tablaProv.setText(0, 1, "Direccion");
                tablaProv.setText(0, 2, "Telefono");
                tablaProv.setText(0, 3, "Modificar");
                tablaProv.setText(0, 4, "Eliminar");
                tablaProv.setBorderWidth(1);
                if (result == null){
                    resultado.setText("No hay datos en la tabla");
                }else{  //recibi datos en result

                    Iterator <ProveedorModel> provIt = result.iterator();
                    int f = 1;

                    while(provIt.hasNext()){
                        ProveedorModel provM = provIt.next();
                        tablaProv.setWidget(f, 0, new Label(provM.getProvRazonSocial()));
                        tablaProv.setWidget(f, 1, new Label(provM.getProvDireccion()));
                        tablaProv.setWidget(f, 2, new Label(provM.getProvTelefono()));

                        final int key = provM.getProvCodigo();
                        final ProveedorModel pM = provM; //prepara un cliente para modificarlo

                        tablaProv.setWidget(f, 3, new Button("Modificar", new ClickHandler() {
                                                        public void onClick(ClickEvent event) {
                                                            modificarProv(key,pM);
                                                        }
                                                    }));
                        tablaProv.setWidget(f, 4, new Button("Eliminar",  new ClickHandler() {
                                                        public void onClick(ClickEvent event) {
                                                            eliminarProv(key);
                                                        }
                                                    }));
                        f++;
                    }
                }

                miABM.add(tablaProv); //cargo la tabla en mi mismo
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Fallo la comunicacion");
            }
        };

        getService().listarProvEncontrados(provRazSoc, callback5);
    }

}
